package com.itheima.dfs.controller;

import com.github.tobato.fastdfs.domain.conn.FdfsWebServer;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.itheima.common.pojo.Result;
import com.itheima.common.util.ImageWrite;
import com.itheima.common.util.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author：shenkunlin
 * @date： 2021/8/22 10:46
 * @Description：实现文件上传
 *  1)创建文件上传方法
 *  2)接收文件，封装对象-MultipartFile
 *  3)文件参数
 *      1：后缀
 *      2：文件字节码数组
 *      3：文件大小
 *  4)将文件上传到FastDFS
 *  5)怎么上传？核心对象有哪些？
 *      1：文件上传对象 FastFileStorageClient
 *      2：文件上传后的文件访问服务地址-FdfsWebServer获取（fdfs.web-server-url）
 ***/
@RestController
public class DfsController {

    @Autowired
    private FastFileStorageClient fastFileStorageClient;

    @Autowired
    private FdfsWebServer fdfsWebServer;

    /***
     * 删除图片
     */
    @DeleteMapping(value = "/delete")
    public Result delete(String path){
        if(path.startsWith("http://")){
            path=path.replace(fdfsWebServer.getWebServerUrl(),"");
        }
        fastFileStorageClient.deleteFile(path);
        return Result.ok();
    }


    /***
     * 下载
     */
    @GetMapping(value = "/download")
    public void download(String path) throws Exception {
        byte[] bytes = fastFileStorageClient.downloadFile("group1", path, new DownloadByteArray());
        ImageWrite.write(RequestContext.getResponse(),bytes,path.substring(path.lastIndexOf("/"),path.length()));
    }



    /***
     * 批量下载
     */
    @PostMapping(value = "/list/download")
    public List<byte[]> download(@RequestParam List<String> images) throws Exception {
        List<byte[]> imageBytes = new ArrayList<byte[]>();
        for (String image : images) {
            if(image.startsWith("http://")){
                image=image.replace(fdfsWebServer.getWebServerUrl()+"group1/","");
            }
            byte[] bytes = fastFileStorageClient.downloadFile("group1", image, new DownloadByteArray());
            imageBytes.add(bytes);
        }
        return imageBytes;
    }

    /**
     * 文件上传
     * 1)创建文件上传方法
     * 2)接收文件，封装对象-MultipartFile
     * 3)文件参数
     *     1：后缀
     *     2：文件字节码数组
     *     3：文件大小
     * 4)将文件上传到FastDFS
     * 5)怎么上传？核心对象有哪些？
     *     1：文件上传对象 FastFileStorageClient
     *     2：文件上传后的文件访问服务地址-FdfsWebServer获取（fdfs.web-server-url）
     */
    @PostMapping(value = "/upload")
    public Result upload(@RequestParam(value = "image") MultipartFile file) throws IOException {
        //后缀  xxx.jpg
        String filename = file.getOriginalFilename();
        String extName = StringUtils.getFilenameExtension(filename);
        //文件字节码数组|数据流
        InputStream is = file.getInputStream();
        //文件大小
        long size = file.getSize();

        /***
         * 将文件上传到FastDFS
         * 1:要上传的文件的数据流
         * 2:文件大小
         * 3:文件后缀名
         * 4:元数据    添加过期表示  2021年9月30日
         */
        StorePath storePath = fastFileStorageClient.uploadFile(is, size, extName, null);
        // group1/M00/00/22/dsfs.jpg
        String fullPath = storePath.getFullPath();
        //组装一个文件的访问地址
        String url = fdfsWebServer.getWebServerUrl()+fullPath;
        return Result.ok(url);
    }

    public static void main(String[] args) {
        String extName = StringUtils.getFilenameExtension("filename.xml");
        System.out.println(extName);
    }
}
